#ifndef MODE_JUDGE_H
#define MODE_JUDGE_H

#include "readcache-with-LRU.h"
#include <stdlib.h>
#include <stdio.h>

//定义page计算错误率依据的历史记录的个数
#define MAX_MODE_JUDGE_PAGE_HISTORY_SIZE 50

#define MAX_MODE_JUDGE_PAGE_LOGIC_CACHE_SIZE 6

//创建一个队列链表来。内部使用双向链表所有东西都在链表头部，然后然后将东西退出到链表尾部
//并且根据退出的值来不断更新正确率这样子就可以了看看是不是可以触发page为更高优先级的模式

//这里我们需要两个表来分别记录page的预测结果和
typedef struct _mode_judge{
    //创建一个伪“读缓存”
    read_cache_t page_logic_readcache;

    //创建一个历史记录链来记录从叶节点中出来的1000个节点的记录，从而来计算最近1000个的正确率
    read_cache_meta_t* history_head;

    //记录page读缓存弹出之后没有访问的次数的变量
    int page_err_predict;

    //记录当前历史记录的数量
    int page_history_size;

    //当前错误率
    int page_err_rate;

    //记录最近1000次访问的历史记录，用来计算每一次预测是不是触发了
    
    //记录历史记录中noah预测

} mode_judge_t;


void init_mode_judge(mode_judge_t* mode_judger);

void update_and_judge_mode(mode_judge_t* mode_judger, long predictor_page);

void update_when_access_page_cache(mode_judge_t* mode_judger, long now_access);

int get_mode_of_predictor(mode_judge_t* mode_judger);

#endif